package com.glory.brepda.activity.material;

import android.os.Handler;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.glory.brepda.R;
import com.glory.brepda.base.BaseActivity;
import com.glory.brepda.callback.CustomDialogEntityCallBack;
import com.glory.brepda.entity.response.BaseResponseBean;
import com.glory.brepda.utils.MyUtils;
import com.glory.brepda.utils.NetUtils;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import com.lzy.okgo.model.Response;
import com.pda.platform.ui.ui_pdaplatform.callback.FreeUI_DialogEntityCallBack;
import com.pda.platform.ui.ui_pdaplatform.callback.FreeUI_EntityCallBack;
import com.pda.platform.ui.ui_pdaplatform.utils_public.FreeApi_DialogUtils;
import com.pda.platform.ui.ui_pdaplatform.utils_public.FreeApi_LogUtils;
import com.pda.platform.ui.ui_pdaplatform.utils_public.FreeApi_StaticMembers;
import com.pda.platform.ui.ui_pdaplatform.view.FreeUI_ClearEditText;

import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;

import butterknife.BindView;
import butterknife.OnClick;

public class MaterialFlowTestingActivity extends BaseActivity {

    @BindView(R.id.tvTitle)
    TextView tvTitle;
    @BindView(R.id.llMain)
    LinearLayout llMain;

    // 物料批次输入框
    FreeUI_ClearEditText etMLotID;

    // 物料名
    TextView tvMaterialName;

    // 物料描述
    TextView tvMaterialDesc;

    // 供应商代码
    TextView tvPartnerCode;

    // 供应商批号
    TextView tvPartnerLotId;

    // 有效期
    TextView tvShelfLifeExpire;

    // 特殊物料
    BigDecimal specialMaterialMainQty;

    // 特殊物料需要执行物料入库的，这里需要提前赋予其入库的仓库号。用到的物料大概有胶水（GLUE）；焊料、助焊剂和锡膏(SOLDER)
    String transStorageId;

    @Override
    protected int getLayoutResId() {
        return R.layout.activity_material_flow_testing;
    }

    @Override
    protected void initView() {

        etMLotID = findViewById(R.id.etMLotID);
        tvMaterialName = findViewById(R.id.tvMaterialName);
        tvMaterialDesc = findViewById(R.id.tvMaterialDesc);
        tvPartnerCode = findViewById(R.id.tvPartnerCode);
        tvPartnerLotId = findViewById(R.id.tvPartnerLotId);
        tvShelfLifeExpire = findViewById(R.id.tvShelfLifeExpire);

        setMainLayout(llMain);
        tvTitle.setText(getIntent().getStringExtra(FreeApi_StaticMembers.SHOW_PLUGIN_KEY));

        // 输入物料批次号后，根据物料批次号解析相关信息
        initEdit(etMLotID, this::parseMaterialMessage);

    }

    /**
     * 解析物料批次号里面的信息，除了物料描述需要请求接口信息其他都可以直接从物料批次号信息里面获取
     * 二维码信心中就前5位和最后一位有用，其他看起来对系统作用不大
     * 示例二维码：WIRE|01100006|1500300400005|20240618|20250617|2406YA2A0267-3169|1000|1000
     * 示例二维码：WIRE|01080005|1500300500006|20240715|20250714|240102087-0168||150（缺失了倒数第二位的材料参数）
     * 01100006 供应商代码，第二位
     * 1500300400005 物料名，需要请求接口信息。第三位
     * 20250617 有效期 第五位
     * 1000 最后一位（重量【塑封料，金蝶云识别标识：EMC】、长度【內引线，金蝶云识别标识：WIRE】）
     * @param mLotID 物料批次号
     */
    private void parseMaterialMessage(String mLotID) {
        if (StringUtils.isEmpty(mLotID)) {
            return;
        }

        String[] mLotMessage = StringUtils.split(mLotID, "|");

        // 目前由于二维码有时候会缺失部分信息【24/8/6，可能会缺失材料参数信息】
        // 故需要放宽对解析集合（mLotMessage）长度判断，原来判断是8，现在转为7
        // 后续如果要对重量进行处理的话，直接先取的最后一位，然后继续转数字试一下。
        if (mLotMessage == null || mLotMessage.length < 7) {
            showConfirmDialog(mLotID + "解析失败，请联系管理员");
            return;
        }

        // 从数组里面获取信息，并设置到相应的位置显示
        String partnerCode = mLotMessage[1];
        String materialName = mLotMessage[2];
        String shelfLifeExpire = mLotMessage[4];

        // 获取物料的信息
        getAndSetMaterialSpec(materialName);
        tvPartnerCode.setText(partnerCode);
        tvMaterialName.setText(materialName);
        tvShelfLifeExpire.setText(shelfLifeExpire);
        // 解析获取供应商批号，一个试流批次只能有一个物料批进行试流
        parsePartnerLotId(mLotMessage[5]);

        // 处理塑封料重量的问题。其实就是读取二维码最后一位数据，然后将其转为数字，将这个数字填进去请求里面（mainQty），发给后台就好。
        if (StringUtils.equals("EMC", mLotMessage[0])) {
            try {
                specialMaterialMainQty = BigDecimal.valueOf(Long.parseLong(mLotMessage[mLotMessage.length - 1]));
            } catch (NumberFormatException e) {
                showToast("解析塑封料重量出错，请联系管理员", false);
                return;
            }
        }

        // 后续需要执行物料入库动作的，这里需要处理，以适配物料入库功能。
        // 目前只有胶水和焊料需要用到这个
        if (StringUtils.equals("GLUE", mLotMessage[0])
            || StringUtils.equals("SOLDER", mLotMessage[0])) {
            transStorageId = "01003*04001";
        }

        // 解析过期时间
        final SimpleDateFormat parseFormatter = new SimpleDateFormat("yyyyMMdd", Locale.CHINA);
        final SimpleDateFormat submitFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss", Locale.CHINA);
        try {
            Date date = parseFormatter.parse(shelfLifeExpire);
            if (date == null) {
                showToast("解析时间出错", false);
                return;
            }
            tvShelfLifeExpire.setText(submitFormatter.format(date));
        } catch (ParseException e) {
            showToast("解析时间出错", false);
            FreeApi_LogUtils.saveErrorMessages(e, e.getMessage());
        }

    }

    /**
     * 解析供应商批号，例子：2406YA2A0267-3169，取里面的2406YA2A0267
     * @param partnerLotIdMessage 供应商代码信息，例：2406YA2A0267-3169
     */
    private void parsePartnerLotId(String partnerLotIdMessage) {

        if (StringUtils.isEmpty(partnerLotIdMessage)) {
            return;
        }

        String[] partnerLot = StringUtils.split(partnerLotIdMessage, "-");

        if (partnerLot == null || partnerLot.length < 2) {
            showToast(partnerLotIdMessage + "供应商批号解析失败，请联系管理员", false);
            return;
        }

        // 供应商批号输入框赋值
        tvPartnerLotId.setText(partnerLot[0]);
    }

    /**
     * 根据物料名请求接口获取物料信息
     * @param materialName 物料代码
     */
    private void getAndSetMaterialSpec(String materialName) {
        FreeUI_EntityCallBack<BaseResponseBean<JsonObject>> callBack = new CustomDialogEntityCallBack<BaseResponseBean<JsonObject>>
                (new TypeToken<BaseResponseBean<JsonObject>>() {
                }.getType(),getSupportFragmentManager(), this) {

            @Override
            public void onSuccess(Response<BaseResponseBean<JsonObject>> response) {
                super.onSuccess(response);
                if (response.body().isSuccess(MaterialFlowTestingActivity.this, false, getSupportFragmentManager())) {
                    JsonObject jsonObject = response.body().getResponse().getBody();
                    // 判断有无设置物料规格，一般都是有设置物料规格的
                    if (jsonObject != null && jsonObject.size() != 0
                            && StringUtils.isNotEmpty(String.valueOf(jsonObject.get("MATERIALSPEC").getAsString()))) {
                        try {
                            tvMaterialDesc.setText(jsonObject.get("MATERIALSPEC").getAsString());
                        } catch (Exception e) {
                            showToast("物料没有设置规格，请联系管理员", false);
                            // 清空掉，物料描述里面的信息
                            MyUtils.clearTextInTextView(tvMaterialDesc);
                        }
                    } else {
                        showToast("物料没有设置规格，请联系管理员", false);
                        // 清空掉，物料描述里面的信息
                        MyUtils.clearTextInTextView(tvMaterialDesc);

                    }
                }
            }

            @Override
            public void onError(Response<BaseResponseBean<JsonObject>> response) {
                super.onError(response);
                FreeApi_LogUtils.saveErrorMessages(response.getException(), "getAndSetMaterialSpec");
            }
        };
        JsonObject map = new JsonObject();
        map.addProperty("ACTION_TYPE", "QUERY_MATERIAL_SPEC");

        HashMap<String, Object> materialMap = new HashMap<>(1, 1);
        materialMap.put("MATERIALNAME", materialName);

        map.add("MLOT", new JsonParser().parse(new Gson().toJson(materialMap)).getAsJsonObject());
        NetUtils.requestPostNet("IF.MLOTFLOWTESTING", "Common", MaterialFlowTestingActivity.this, map, callBack);
    }

    @OnClick({R.id.tvBaseSubmit})
    public void onViewClicked(View view) {
        if (view.getId() == R.id.tvBaseSubmit) {
            // 显示确定按钮，点击确定后提交物料信息进行试流
            FreeApi_DialogUtils.getConfirmAndCancelDialog(this, "确定要提交?", this::submitFlowTesting, ()->{}).show(getSupportFragmentManager(),"MaterialFlowTesting");
        }
    }

    /**
     * 提交试流批次，后台对该物料批次进行接收入库操作
     */
    private void submitFlowTesting() {

        if (MyUtils.checkTextIsEmptyInAnyTextView(false, etMLotID, tvPartnerCode, tvShelfLifeExpire
                , tvMaterialDesc, tvPartnerLotId, tvPartnerCode)) {
            showToast("信息填写未完成，请检查", false);
            return;
        }

        FreeUI_EntityCallBack<BaseResponseBean<JSONObject>> callback = new FreeUI_DialogEntityCallBack<BaseResponseBean<JSONObject>>
                (new TypeToken<BaseResponseBean<JSONObject>>() {
                }.getType(), getSupportFragmentManager(), this) {

            @Override
            public void onSuccess(Response<BaseResponseBean<JSONObject>> response) {
                super.onSuccess(response);
                if (response.body().isSuccess(getApplicationContext(), true, getSupportFragmentManager())) {
                    showToast("提交成功",true);

                    new Handler().postDelayed(() -> cleanTextWhileSuccess(), 1000);

                }
            }

            @Override
            public void onError(Response<BaseResponseBean<JSONObject>> response) {
                super.onError(response);
                loadError(response.getException(), "submitFlowTesting");
            }
        };
        JsonObject map = new JsonObject();
        map.addProperty("ACTION_TYPE", "FLOW_TESTING");

        HashMap<String, Object> materialMap = new HashMap<>(4,1);
        materialMap.put("MLOTID", getText(etMLotID));
        materialMap.put("SHELFLIFEEXPIRE", tvShelfLifeExpire.getText());
        materialMap.put("MATERIALNAME", tvMaterialName.getText());
        materialMap.put("PARTNERLOTID", tvPartnerLotId.getText());
        materialMap.put("PARTNERCODE", tvPartnerCode.getText());

        // specialMaterialMainQty目前只有塑封料需要使用，塑封料的mainQty对应其重量
        if (specialMaterialMainQty != null) {
            materialMap.put("MAINQTY", specialMaterialMainQty);
        }

        // 处理需要执行物料入库动作的，需要为reserved8赋值，不然适配不了后台的物料入库接口功能
        if (StringUtils.isNotEmpty(transStorageId)) {
            materialMap.put("RESERVED8", transStorageId);
        }

        map.add("MLOT", new JsonParser().parse(new Gson().toJson(materialMap)).getAsJsonObject());
        NetUtils.requestPostNet("IF.MLOTFLOWTESTING", "Common", MaterialFlowTestingActivity.this, map, callback);

    }

    @Override
    protected void initData() {

    }

    /**
     * 完成业务后，清除掉输入框，文本框里面的信息
     */
    private void cleanTextWhileSuccess() {
        MyUtils.clearTextInTextView(etMLotID ,tvMaterialName, tvMaterialDesc, tvPartnerLotId, tvPartnerCode, tvShelfLifeExpire);
    }

}